package cn.coco.jf.fw.admin.sys.controller.role;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;

import cn.coco.jf.fw.core.db.SysMenuRoleRel;
import cn.coco.jf.fw.core.db.SysMenuTbl;
import cn.coco.jf.fw.core.db.SysRoleTbl;
import cn.coco.jf.fw.admin.config.consts.SysConsts;
import cn.coco.jf.fw.admin.controller.FwBaseController;
import cn.coco.jf.fw.admin.model.TreeNode;
import cn.coco.jf.fw.admin.sys.dao.SysDao;
import cn.coco.jf.fw.admin.sys.dao.role.RoleDao;
import cn.coco.jf.fw.admin.sys.model.role.RoleModel;
import cn.exlu.coco.core.utils.StringUtil;


/**
 * 客户信息
 * 客户信息.
 * 
 * @version 1.0.0
 * @author Mark
 * @see 参照者
 * @since 1.0.1.1
 * @date 2017年11月13日
 */
public class RoleController extends FwBaseController {
    private static Logger _LOG = Logger.getLogger(RoleController.class);

    /**
     * 进入页面
     */
    public void index(){
        this.render("roleIndex.html");
    }

    /**
     * 用户一览
     */
    public void doPage(){
        int pageIndex = this.getParaToInt("page");
        int pageSize = this.getParaToInt("rows");


        Page<RoleModel> page = RoleDao.page(pageIndex, pageSize);
        
        pageJson(page);
        
        this.renderJson();
    }


    /**
     * 新增页面
     */
    public void add(){
        this.setAttr("_oper", "add");
        this.render("roleEdit.html");

    }

    /**
     * 新增处理
     */
    public void doAdd(){
        SysRoleTbl m = this.getBean(SysRoleTbl.class, "", true);

        if(StringUtil.isNullOrEmpty(m.getRoleName())){
            this.errJson("请输入角色名称!");
            return;
        }

        // ====== 设置数据 ======
        m.setDelFlg(SysConsts.DEL_FLG_NORMAL);

        m.save();

        successJson(null);
    }
    

    /**
     * 修改页面
     */
    public void upd(){
        Integer roleId = this.getParaToInt("roleId");

        if(roleId == null){
            this.errJson("请选择一条记录!");
            return;
        }

        SysRoleTbl sysRoleTbl = SysRoleTbl.dao.findById(roleId);
        
        if(sysRoleTbl == null){
            this.errJson("记录不存在!");
            return;
        }

        this.setAttrJsonStr("model", sysRoleTbl);

        this.setAttr("_oper", "upd");
        this.render("roleEdit.html");
    }
    
    /**
     * 更新处理
     */
    public void doUpd(){
        SysRoleTbl m = this.getBean(SysRoleTbl.class, "", true);
        
        if(m.getRoleId() == null){
            this.errJson("请选择一条记录!");
            return;
        }
        
        SysRoleTbl sysRoleTbl = SysRoleTbl.dao.findById(m.getRoleId());
        
        if(sysRoleTbl == null){
            this.errJson("记录不存在!");
            return;
        }
        
        if(StringUtil.isNullOrEmpty(m.getRoleName())){
            this.errJson("请输入角色名称!");
            return;
        }

        m.update();
        
        this.successJson(null);

    }

    /**
     * 删除处理
     */
    public void doDel(){
        Integer[] roleIds = this.getParaValuesToInt("roleIds");
        

        if(roleIds == null || roleIds.length <=0){
            this.errJson("请选择一条记录!");
            return;
        }

        List<SysRoleTbl> list = new ArrayList<SysRoleTbl>();
        SysRoleTbl sysRoleTbl = null;

        for(Integer roleId:roleIds){
            sysRoleTbl = SysRoleTbl.dao.findById(roleId);
            
            if(sysRoleTbl == null){
                this.errJson("记录不存在!");
                return;
            }

            sysRoleTbl.setDelFlg(SysConsts.DEL_FLG_DEL);


            list.add(sysRoleTbl);

        }

        Db.batchSave(list, 100);
        
        this.successJson(null);
    }
    
    /**
     * 权限分配
     */
    public void addAuth(){
        Integer roleId = this.getParaToInt("roleId");

        if(roleId == null){
            this.errJson("请选择一条记录!");
            return;
        }

        SysRoleTbl sysRoleTbl = SysRoleTbl.dao.findById(roleId);
        
        if(sysRoleTbl == null){
            this.errJson("记录不存在!");
            return;
        }

        this.setAttrJsonStr("model", sysRoleTbl);

        this.render("roleAuthEdit.html");
    }
    
    public void selectMenuAndAuthByRoleId(){
        Integer roleId = this.getParaToInt("roleId");
        
        
        
        List<SysMenuTbl> authList = SysDao.querySysMenuTblListByRoleId(roleId);
        
        List<Integer> authMenuIds = new ArrayList<Integer>();
        for(SysMenuTbl entity: authList){
            authMenuIds.add(entity.getId());
        }
        
        List<SysMenuTbl> authTempList=new ArrayList<SysMenuTbl>();

        
        // 生成TreeNode
        List<SysMenuTbl> allMenulist = SysDao.querySysMenuTblList();
        Map<Integer,TreeNode> allMap=new HashMap<Integer, TreeNode>();
        TreeNode treeNode=null;
        Map<String,Object> attrMap=null;
        for(SysMenuTbl entity:allMenulist){
            treeNode = new TreeNode();
            treeNode.setId(entity.getId());
            treeNode.setText(entity.getTitle());
            attrMap = new HashMap<String,Object>();
            treeNode.setChildren(new ArrayList<TreeNode>());
            treeNode.setAttributes(attrMap);
            
            if(!authMenuIds.contains(entity.getId())){
                // 无权限的场合
                treeNode.setChecked(false);
            }else{
                // 有权限的场合
                treeNode.setChecked(true);
            }
            
            allMap.put(treeNode.getId(), treeNode);
            
//            authTempList.add(entity);
        } 

        Map<Integer, TreeNode> rootMap=new HashMap<Integer,TreeNode>();

        for(SysMenuTbl entity:allMenulist){
            
            TreeNode node =allMap.get(entity.getId());
            if(node==null){
                continue;
            }
            
            if(SysConsts.ROOT_MENU_ID == entity.getParentId()){
                // 根节点
                rootMap.put(node.getId(), node);
            }else{
                TreeNode treeNode1 = allMap.get(entity.getParentId());
                if(treeNode1 != null){
                    treeNode1.getChildren().add(node);
                    // 设置父节点不选择，目的在于如果父节点设置选中，则子节点都会被选中。
                    treeNode1.setChecked(false);
                }
            }

        }
        List<TreeNode> resultList=new ArrayList<TreeNode>();
        resultList.addAll(rootMap.values());
        
        this.successJson(resultList);
        
    }
    
    public void doTxAddAuth(){
        Integer roleId = this.getParaToInt("roleId");
        String menuIdsStr= this.getPara("menuIds");
        
        String[] menuIds = menuIdsStr.split(",");
        
        if(menuIds.length== 1 && "".equals(menuIds[0])){
            menuIds =new String[0];
        }
        
        if(roleId == null){
            this.errJson("请选择一条记录!");
            return;
        }
        
        SysRoleTbl sysRoleTbl = SysRoleTbl.dao.findById(roleId);
        
        if(sysRoleTbl == null){
            this.errJson("记录不存在!");
            return;
        }
        
        // ======删除已有权限======
        RoleDao.deleteMenuIdByRoleId(roleId);
        
        // ======记录新的权限======
        SysMenuRoleRel sysMenuRoleRel = null;
        for(String menuId : menuIds){
            sysMenuRoleRel = SysMenuRoleRel.newInstance();
            sysMenuRoleRel.setMenuId(Integer.valueOf(menuId));
            sysMenuRoleRel.setRoleId(roleId);
            
            sysMenuRoleRel.save();
        }

        this.successJson(null);
    }
    
    

}
